1、将一个数组中的0移到到末尾，但是不改变非0的相对位置
思想：用2个指针即可，一个找非0，另一个找0移动到非0位置
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int i=0;//找非0
        int j=0;//定位0
        while(i<nums.size())
        {
            while(i<nums.size()&&nums[i]==0)
            {
                i++;
            }
            if(i<nums.size()&&nums[j]==0)
            {
                int tmp=nums[j];
                nums[j]=nums[i];
                nums[i]=tmp;
                j++;
                i++;
            }
            else
            {
                j++;
                i++;
            }
        }
    }
};

2、二叉树的后序遍历
给定一个数组，判断其是否是某颗二叉搜索树的后序遍历
思想：因为后序遍历 所以数组的最后一个位置一定是根，又因为其树是二叉搜索树，所以左子树的节点值一定都小于根，根据这2点，可以将数组分为左子树，右子树，根，3部分
然后递归左子树，右子树，
class Solution {
public:
    bool _verifyPostorder(vector<int>& postorder,int first,int end)
    {
        if(first>=end)
            return true;
        int i=first;  int j=0;
        //找到数组中左子树，因为左子树一定小于根    
        for(;i<end;++i)
        {
            if(i<end&&postorder[i]<postorder[end])
                continue;
            else
                break;
        }
        j=i;
        while(i<end)
        {
            if(postorder[i++]<postorder[end])
                return false;
        }
        return _verifyPostorder(postorder,first,j-1)&&_verifyPostorder(postorder,j,end-1);
    }
    bool verifyPostorder(vector<int>& postorder) {
        int first=0;
        int end=postorder.size()-1;
        if(first==end)
            return true;
        return _verifyPostorder(postorder,first,end);
    }
};

3、丑数，只含有2，3，5质因子的数
思想：因为只含有2、3、5的质因子，也就是任意一个丑数都可以由其前丑数乘2或*3、*5形成的，又因为是递增的，所以找到其3中，最小一个即可
class Solution {
public:
    int nthUglyNumber(int n) {
        int a[1691]={0};
        if(n==0)
            return 0;
        int index=0;
        int t2=0;
        int t3=0;
        int t5=0;
        a[0]=1;
        while(index<n)
        {
            while(a[t2]*2<=a[index])
            {
                t2++;
            }
            while(a[t3]*3<=a[index])
            {
                t3++;
            }
            while(a[t5]*5<=a[index])
            {
                t5++;
            }
            int min=0;
            if(a[t2]*2<=a[t3]*3&&a[t2]*2<=a[t5]*5)
                min=a[t2]*2;
            else if(a[t3]*3<=a[t2]*2&&a[t3]*3<=a[t5]*5)
                min=a[t3]*3;
             else if(a[t5]*5<=a[t2]*2&&a[t5]*5<=a[t3]*3)
                min=a[t5]*5;
            index++;
            a[index]=min;
        }
        return a[n-1];
    }
};